import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_myshop/model/shoping_car.dart';
import 'package:flutter_myshop/service/service_method.dart';
import 'package:shared_preferences/shared_preferences.dart';

class ShopingCarProvider with ChangeNotifier {
  // cate 变量
  // 本地化Key
  static const KEY = "shoping_car";

  //购物车
  List<Good> carGoodList = [];

  //记录选中的id
  List<String> checkIdList = [];

  //选中的价格
  double totalPrice = 0.0;

  // cate 方法
  //保存到购物车
  void addToCar(id, name, count, price, images) async {
    // 实例持久化对象
    SharedPreferences preferences = await SharedPreferences.getInstance();

    // 同步数据
    await syncCarFromPersistence();

    //?购物车中是否已经存在该商品
    // 存在的标志,默认不存在
    bool isHave = false;
    // 标注存在的位置
    int goodIndex = 0;

    carGoodList.map((item) {
      // 存在
      if (id == item.id) {
        isHave = true;
      }
      goodIndex++;
    });

    // 已经存在该商品
    if (isHave) {
      // 加上数目
      carGoodList[goodIndex].count += count;
    }

    // 不存在该商品
    else {
      carGoodList.add(new Good(
        id: id,
        name: name,
        price: price,
        images: images,
        count: count,
      ));
    }

    // 持久到本地
    preferences.setString(KEY, json.encode(carGoodList));

    // 发送到服务器
    updateShopingCar(goodList: carGoodList);

    //log : 内存中的商品id
    carGoodList.forEach((item) {
      print(item.id);
    });

    notifyListeners();
  }

  // 同步持久化和内存
  void syncCarFromPersistence() async {
    // 实例持久化对象
    SharedPreferences preferences = await SharedPreferences.getInstance();

    // 得到购物车持久化字符串
    var carStr = preferences.getString(KEY);

    //? 内存中是否有数据
    //没有
    if (carGoodList.length == 0) {
      //? 本地是否有数据
      // 没有数据
      if (carStr == null) {
        var val = await getShopingCar();
        ShopingCarModel shopingCarModel = ShopingCarModel.fromJson(val["data"]);
        //? 服务器是否有数据
        // 有数据
        if (shopingCarModel.car.count != 0) {
          // 加入内存
          carGoodList = shopingCarModel.car.goods;
          // 持久化
          preferences.setString(KEY, jsonEncode(carGoodList));
        }
      }
      // 有数据
      else {
        List carJson = json.decode(carStr);
        carJson.forEach((item) {
          // 加入内存
          carGoodList.add(Good.fromJson(item));
        });
      }
    }

    notifyListeners();
  }

  // 将内存进行本地化和更新服务器数据
  void syncCarToPersistence() async {
    // 实例持久化对象
    SharedPreferences preferences = await SharedPreferences.getInstance();

    // 将内存数据本地持久化化
    preferences.setString(KEY, json.encode(carGoodList));

    // 将内存数据发给服务器
    updateShopingCar(goodList: carGoodList);

    notifyListeners();
  }

  // 清除购物车
  void clearCar() async {
    // 实例持久化对象
    SharedPreferences preferences = await SharedPreferences.getInstance();

    // 清除内存
    carGoodList = [];
    // 清除本地
    preferences.clear();

    //todo 清除服务器端

    notifyListeners();
  }

  // 点击选中之后
  void checkOne(String id) {
    // 得到选中index
    int goodIndex = 0;
    carGoodList.forEach((item) {
      if (item.id == id) {
        goodIndex = carGoodList.indexOf(item);
      }
    });
    Good good = carGoodList[goodIndex];
    //?  是否已经选中
    // 之前已经选中
    if (checkIdList.contains(id)) {
      checkIdList.remove(id);
      totalPrice -= good.count * good.price;
    }
    // 之前未选中
    else {
      checkIdList.add(id);
      totalPrice += good.count * good.price;
    }
    notifyListeners();
  }

  // 点击全选
  void checkAll() {
    // ? 是否已全选
    // 已全选
    if (checkIdList.length == carGoodList.length) {
      checkIdList = [];
      totalPrice = 0;
    }
    // 未全选
    else {
      // 先清空选中
      checkIdList = [];
      totalPrice = 0;
      carGoodList.forEach((item) {
        checkIdList.add(item.id);
        totalPrice += item.count * item.price;
      });
    }
    notifyListeners();
  }

  // 点击删除
  void clearOne(Good good) {
    // 删除内存中的数据
    carGoodList.remove(good);

    // 去除对应的选择id
    checkIdList.remove(good.id);

    // 本地化
    syncCarToPersistence();
  }

  // 商品数目增加
  void addGoodCount(changeIndex) {
    carGoodList[changeIndex].count++;
    //?是否已经被选中
    // yes
    if(checkIdList.contains(carGoodList[changeIndex].id)){
      totalPrice += carGoodList[changeIndex].price;
    }  
    syncCarToPersistence();
  }

  // 商品数目减少
  void deleteGoodCount(changeIndex) {
    carGoodList[changeIndex].count--;
    //?是否已经被选中
    // yes
    if(checkIdList.contains(carGoodList[changeIndex].id)){
      totalPrice -= carGoodList[changeIndex].price;
    }  
    syncCarToPersistence();
  }
}
